home *** CD-ROM | disk | FTP | other *** search
/ Internet Info 1994 March / Internet Info CD-ROM (Walnut Creek) (March 1994).iso / networking / ip / ka9q / src.arc / MISC.C < prev    next >
C/C++ Source or Header  |  1989-08-19  |  4KB  |  212 lines

  1. /* Miscellaneous machine independent utilities */
  2. #include <stdio.h>
  3. #include "global.h"
  4. #include "socket.h"
  5.  
  6. /* Select from an array of strings, or return ascii number if out of range */
  7. char *
  8. smsg(msgs,nmsgs,n)
  9. char *msgs[];
  10. unsigned nmsgs,n;
  11. {
  12.     static char buf[16];
  13.  
  14.     if(n < nmsgs && msgs[n] != NULLCHAR)
  15.         return msgs[n];
  16.     sprintf(buf,"%u",n);
  17.     return buf;
  18. }
  19.  
  20. /* Convert hex-ascii to integer */
  21. int
  22. htoi(s)
  23. char *s;
  24. {
  25.     int i = 0;
  26.     char c;
  27.  
  28.     while((c = *s++) != '\0'){
  29.         if(c == 'x')
  30.             continue;    /* allow 0x notation */
  31.         if('0' <= c && c <= '9')
  32.             i = (i * 16) + (c - '0');
  33.         else if('a' <= c && c <= 'f')
  34.             i = (i * 16) + (c - 'a' + 10);
  35.         else if('A' <= c && c <= 'F')
  36.             i = (i * 16) + (c - 'A' + 10);
  37.         else
  38.             break;
  39.     }
  40.     return i;
  41. }
  42. /* replace terminating end of line marker(s) with null */
  43. void
  44. rip(s)
  45. register char *s;
  46. {
  47.     register char *cp;
  48.  
  49.     if((cp = strchr(s,'\r')) != NULLCHAR)
  50.         *cp = '\0';
  51.     if((cp = strchr(s,'\n')) != NULLCHAR)
  52.         *cp = '\0';
  53. }
  54. /* Routines not needed for Turbo 2.0, but available for older libraries */
  55. #ifdef    AZTEC
  56.  
  57. /* Copy a string to a malloc'ed buffer */
  58. char *
  59. strdup(s)
  60. const char *s;
  61. {
  62.     register char *out;
  63.     register int len;
  64.  
  65.     if(s == NULLCHAR)
  66.         return NULLCHAR;
  67.     len = strlen(s);
  68.     if((out = malloc(len+1)) == NULLCHAR)
  69.         return NULLCHAR;
  70.     /* This is probably a tad faster than strcpy, since we know the len */
  71.     memcpy(out,s,len);
  72.     out[len] = '\0';
  73.     return out;
  74. }
  75.  
  76. /* Case-insensitive string comparison */
  77. strnicmp(a,b,n)
  78. register char *a,*b;
  79. register int n;
  80. {
  81.     char a1,b1;
  82.  
  83.     while(n-- != 0 && (a1 = *a++) != '\0' && (b1 = *b++) != '\0'){
  84.         if(a1 == b1)
  85.             continue;    /* No need to convert */
  86.         a1 = tolower(a1);
  87.         b1 = tolower(b1);
  88.         if(a1 == b1)
  89.             continue;    /* NOW they match! */
  90.         if(a1 > b1)
  91.             return 1;
  92.         if(a1 < b1)
  93.             return -1;
  94.     }
  95.     return 0;
  96. }
  97.  
  98. char *
  99. strtok(s1,s2)
  100. char *s1;    /* Source string (first call) or NULL */
  101. #ifdef    __STDC__    /* Ugly kludge for aztec's declaration */
  102. const char *s2;    /* Delimiter string */
  103. #else
  104. char *s2;    /* Delimiter string */
  105. #endif
  106. {
  107.     static int isdelim();
  108.     static char *next;
  109.     register char *cp;
  110.     char *tmp;
  111.  
  112.     if(s2 == NULLCHAR)
  113.         return NULLCHAR;    /* Must give delimiter string */
  114.  
  115.     if(s1 != NULLCHAR)
  116.         next = s1;        /* First call */
  117.  
  118.     if(next == NULLCHAR)
  119.         return NULLCHAR;    /* No more */
  120.  
  121.     /* Find beginning of this token */
  122.     for(cp = next;*cp != '\0' && isdelim(*cp,s2);cp++)
  123.         ;
  124.  
  125.     if(*cp == '\0')
  126.         return NULLCHAR;    /* Trailing delimiters, no token */
  127.  
  128.     /* Save the beginning of this token, and find its end */
  129.     tmp = cp;
  130.     next = NULLCHAR;    /* In case we don't find another delim */
  131.     for(;*cp != '\0';cp++){
  132.         if(isdelim(*cp,s2)){
  133.             *cp = '\0';
  134.             next = cp + 1;    /* Next call will begin here */
  135.             break;
  136.         }
  137.     }
  138.     return tmp;
  139. }
  140. static int
  141. isdelim(c,delim)
  142. char c;
  143. register char *delim;
  144. {
  145.     char d;
  146.  
  147.     while((d = *delim++) != '\0'){
  148.         if(c == d)
  149.             return 1;
  150.     }
  151.     return 0;
  152. }
  153. #endif    /* AZTEC */
  154.  
  155.  
  156.  
  157. /* Host-network conversion routines, replaced on the 8086 with assembler */
  158. #ifndef    MSDOS
  159. /* Put a long in host order into a char array in network order */
  160. char *
  161. put32(cp,x)
  162. register char *cp;
  163. int32 x;
  164. {
  165.     *cp++ = x >> 24;
  166.     *cp++ = x >> 16;
  167.     *cp++ = x >> 8;
  168.     *cp++ = x;
  169.     return cp;
  170. }
  171. /* Put a short in host order into a char array in network order */
  172. char *
  173. put16(cp,x)
  174. register char *cp;
  175. int16 x;
  176. {
  177.     *cp++ = x >> 8;
  178.     *cp++ = x;
  179.  
  180.     return cp;
  181. }
  182. int16
  183. get16(cp)
  184. register char *cp;
  185. {
  186.     register int16 x;
  187.  
  188.     x = uchar(*cp++);
  189.     x <<= 8;
  190.     x |= uchar(*cp);
  191.     return x;
  192. }
  193. /* Machine-independent, alignment insensitive network-to-host long conversion */
  194. int32
  195. get32(cp)
  196. register char *cp;
  197. {
  198.     int32 rval;
  199.  
  200.     rval = uchar(*cp++);
  201.     rval <<= 8;
  202.     rval |= uchar(*cp++);
  203.     rval <<= 8;
  204.     rval |= uchar(*cp++);
  205.     rval <<= 8;
  206.     rval |= uchar(*cp);
  207.  
  208.     return rval;
  209. }
  210. #endif
  211.  
  212.